package com.example.demo.cbhs;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.context.WriteContextImpl;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.example.demo.cbhs.EasyExcelCellWriteHandler;
import com.example.demo.model.BizInfo;
import com.example.demo.model.CalculateData;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

/**
 * @author linjingze
 * @date 2023/12/19 8:49 AM
 */
public class FillCalculateTemplate {


    public static void fill(OutputStream outputStream, InputStream templateFileName, CalculateData calculateData) {
        try (ExcelWriter excelWriter = EasyExcel.write(outputStream)
                .registerWriteHandler(new EasyExcelCellWriteHandler(calculateData.getBizInfoList().size())).withTemplate(templateFileName).build()) {
            WriteSheet writeSheet = EasyExcel.writerSheet().build();
            // 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行，然后下面的数据往后移动。默认 是false，会直接使用下一行，如果没有则创建。
            // forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了，所以慎用
            // 简单的说 如果你的模板有list,且list不是最后一行，下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
            // 如果数据量大 list不是最后一行 参照下一个
            FillConfig fillConfig = FillConfig.builder()
                    .forceNewRow(Boolean.TRUE)
                    .build();
            List<BizInfo> bizInfoList = calculateData.getBizInfoList();
            excelWriter.fill(() -> bizInfoList, fillConfig, writeSheet);
            excelWriter.fill(calculateData, writeSheet);
            // 设置强制重新计算公式
            WriteContextImpl writeContext = (WriteContextImpl) excelWriter.writeContext();
            writeContext.getCurrentSheet().setForceFormulaRecalculation(true);
        }

    }

    public static void main(String[] args) throws Exception {
        FileOutputStream fileOutputStream = new FileOutputStream("test" + System.currentTimeMillis() + ".xls");

        //fill(fileOutputStream, FillCalculateTemplate.class.getResourceAsStream("/成本模版.xlsx"));
    }

}
